package com.king.common.utils.uuid;

import java.util.concurrent.atomic.AtomicInteger;

import com.king.common.utils.DateTimeUtil;
import com.king.common.utils.text.StringUtils;

/**
 * @author king 序列生成类
 */
public class Seq {
	// 通用序列类型
	public static final String commSeqType = "COMMON";

	// 上传序列类型
	public static final String uploadSeqType = "UPLOAD";

	// 通用接口序列数
	private static AtomicInteger commSeq = new AtomicInteger(1);

	// 上传接口序列数
	private static AtomicInteger uploadSeq = new AtomicInteger(1);

	// 机器标识
	private static String machineCode = "A";

	/**
	 * 获取通用序列号
	 * 
	 * @return 序列值
	 */
	public static String getId() {
		return getId(commSeqType);
	}

	/**
	 * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串
	 * 
	 * @return 序列值
	 */
	public static String getId(String type) {
		AtomicInteger atomicInt = commSeq;
		if (uploadSeqType.equals(type)) {
			atomicInt = uploadSeq;
		}
		return getId(atomicInt, 3);
	}

	/**
	 * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串
	 * 
	 * @param atomicInt
	 *            序列数
	 * @param length
	 *            数值长度
	 * @return 序列值
	 */
	public static String getId(AtomicInteger atomicInt, int length) {
		String result = DateTimeUtil.dateTimeNow();
		result += machineCode;
		result += getSeq(atomicInt, length);
		return result;
	}

	/**
	 * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数
	 * 
	 * @return 序列值
	 */
	private synchronized static String getSeq(AtomicInteger atomicInt, int length) {
		// 先取值再+1
		int value = atomicInt.getAndIncrement();

		// 如果更新后值>=10 的 (length)幂次方则重置为1
		int maxSeq = (int) Math.pow(10, length);
		if (atomicInt.get() >= maxSeq) {
			atomicInt.set(1);
		}
		// 转字符串，用0左补齐
		return StringUtils.padl(value, length);
	}
}
